package com.example.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.controller.util.Code;
import com.example.controller.util.Data;
import com.example.controller.util.SaltMD5Util;
import com.example.domain.User;
import com.example.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@CrossOrigin
@Slf4j
@RequestMapping("/users")
public class UserController {

    @Autowired
    IUserService userService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

//    查询全部
    @GetMapping
    public Data test() {
        List<User> list = userService.list();
        Integer code = list!=null ? Code.Code_ok : Code.Code_err;
        String msg = list != null ? "querry_ok" : "querry_err";
        return new Data(code,list,msg);
    }

    /**
     * 实现登录功能！
     *
     * @return
     */
//    @PostMapping("login2")
//    public Data loginByPassword(@RequestBody User user) {
//        String name = user.getName();
//        String pwd = user.getPassword();
//        //根据账户查找用户，取出数据库中的密码和输入密码进行md5对比！
//        User one = userService.getOne(name);
//        if (StringUtils.isEmpty(one)) {
//            return new Data(203, "用户名错误！");
//        }
//        String saltPassword = one.getPassword();
//        String password = user.getPassword();
//
//        //密码校验！
//        boolean result = SaltMD5Util.verifySaltPassword(password, saltPassword);
//        String msg = result != false ? "查询成功" : "查询失败";
//        if (result == false) {
//            return new Data(202, "密码错误！请重新输入");
//        }
//
//        // 7.保存用户信息到Redis（ key为token）
//        // 7.1.生成Token
//        String token = UUID.randomUUID().toString(true);
//        System.out.println("token值为" + token);
//        String tokenKey = LOGIN_USER_KEY + token;
//        PhoneDto dto = BeanUtil.copyProperties(one, PhoneDto.class);
//        dto.setPhone("");
//        dto.setCode("");
//        dto.setAuthority("");
//        Map<String, Object> userMap = BeanUtil.beanToMap(dto, new HashMap<>(),
//                CopyOptions.create()
//                        .setIgnoreNullValue(true)
//                        .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
//        stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
//        // 7.4.设置有效期30分钟,但是如果用户在一直访问则必须刷新有效期（用  拦截器实现）
//        stringRedisTemplate.expire(LOGIN_USER_KEY + token, LOGIN_USER_TTL, TimeUnit.MINUTES);
//        return new Data(200, one, "登录成功！", token);
//    }
//
//    @PostMapping("/send")
//    public Data sendCode(@RequestBody User user, HttpSession session) {
//        // 1.校验手机号
//        String phone = user.getPhone();
//        if (RegexUtils.isPhoneInvalid(phone)) {
//            // 2.如果不符合，返回错误信息
//            return new Data(201, "请输入正确的手机号");
//        }
//        // 3.符合，生成验证码
//        String code = RandomUtil.randomNumbers(6);
//        // 4.保存验证码到Redis
//        stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);
//        // 5.发送验证码
//        System.out.println("发送短信验证码成功，验证码：" + code);
//        return new Data(200, "发送短信验证码成功!");
//    }
//
//    /**
//     * 根据手机验证码登录
//     * 新建DTO类，封装一个验证码属性!
//     *
//     * @param phoneDto
//     * @param session
//     */
//    @PostMapping("/login")
//    public Data loginByCode(@RequestBody PhoneDto phoneDto, HttpSession session) {
//        return userService.login(phoneDto, session);
//    }

//    实现登录
    @PostMapping("/login")
    public Data loginUser(@RequestBody User user){
        String name = user.getName();
        String pwd = user.getPassword();
        //根据账户查找用户，取出数据库中的密码和输入密码进行md5对比！
        User one = userService.getOne(name);
        if (StringUtils.isEmpty(one)) {
            return new Data(203, "用户名错误！");
        }
        String saltPassword = one.getPassword();
        String password = user.getPassword();

        //密码校验！
        boolean result = SaltMD5Util.verifySaltPassword(password, saltPassword);
        String msg = result != false ? "查询成功" : "查询失败";
        if (result == false) {
            return new Data(202, "密码错误！请重新输入");
        }else{
            String token = "welcome_community";
            return new Data(200,one,"登录成功",token);
        }
    }

    /**
     * 新增用户
     *
     * @param user
     * @return
     */
    @PostMapping
    public Data save(@RequestBody User user) {
        User user1 = userService.getUser(user.getName());
        if (user1 != null) {
            return new Data(201, "该用户已存在");
        }
//  Todo 将密码进行md5加盐加密
        String password = user.getPassword();
        System.out.println(password);
        String saltPassword = SaltMD5Util.generateSaltPassword(password);
        user.setPassword(saltPassword);
        System.out.println(saltPassword);
        boolean save = userService.save(user);
        if (save == false) {
            return new Data(202, "用户添加异常！请重试");
        }
        return new Data(200, "添加成功");
    }

    //    按分页查询
    @GetMapping("/page/{page}/{size}")
    public Data getPage(@PathVariable Integer page, @PathVariable Integer size) {
        IPage<User> pageUser = userService.getPageUser(page, size);
        Integer code = pageUser != null ? Code.Code_ok : Code.Code_err;
        String msg = pageUser != null ? "查询成功" : "查询失败";
        return new Data(code, pageUser, msg);
    }

    @DeleteMapping("/{id}")
    public Data deleteUser(@PathVariable Integer id) {
        boolean remove = userService.removeById(id);
        Integer code = remove != false ? Code.Code_ok : Code.Code_err;
        String msg = remove != false ? "删除成功" : "删除失败";
        return new Data(code, msg);
    }

}
